import Vue from 'vue'
import Router from 'vue-router'
import { Dialog, Toast } from 'vant'
import { get, post } from '@/assets/service/http'
Vue.use(Router)

/**
 * meta中特殊参数说明
 * @param unAuthorization // 不用走网页授权获取openid
 * @param setMenuAndShareInPage // 在路由对应的页面中，设置微信工具菜单的显隐和分享
 * @param showAllMenu // 展示所有微信工具菜单
 * @param showMenuList // 需要展示的微信工具菜单
 * @param forbitShare // 禁止自定义分享
 * @param shareInfo // 分享的配置信息 title、desc、link、imgUrl
 */
const route = new Router({
  mode: 'history',
  base: `${process.env.VUE_APP_BASE_URL}${process.env.VUE_APP_VERSION}/`,
  routes: [
    {
      path: '/',
      redirect: '/home'
    },
    {
      path: '/index',
      name: 'index',
      component: () => import('@/views/index')
    },
    {
      path: '/home',
      name: 'meetingHome',
      component: () => import('@/views/meeting/home'),
      meta: {
        title: '会议主页',
        setMenuAndShareInPage: true
      }
    },
    // {
    //   path: '/sign',
    //   name: 'meetingSign',
    //   component: () => import('@/views/meeting/sign'),
    //   meta: {
    //     title: '签到',
    //     setMenuAndShareInPage: true
    //   }
    // },
    // {
    //   path: '/signResult',
    //   name: 'signResult',
    //   component: () => import('@/views/meeting/signResult'),
    //   meta: {
    //     title: '签到结果',
    //     forbitShare: true
    //   }
    // },
    {
      path: '/voteSurveyList',
      name: 'voteSurveyList',
      component: () => import('@/views/meeting/voteSurveyList'),
      meta: {
        title: '投票调研',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/questionList',
      name: 'questionList',
      component: () => import('@/views/meeting/questionList'),
      meta: {
        title: '我的提问',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/questionScreen',
      name: 'questionScreen',
      component: () => import('@/views/meeting/questionScreen'),
      meta: {
        title: '提问上墙',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/commentList',
      name: 'commentList',
      component: () => import('@/views/meeting/commentList'),
      meta: {
        title: '我的评论',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/personCenter',
      name: 'meetingPersonCenter',
      component: () => import('@/views/meeting/personCenter'),
      meta: {
        title: '会议中心',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '/meetingList/:type',
      name: 'meetingList',
      component: () => import('@/views/meeting/list'),
      meta: {
        title: '会议列表',
        showMenuList: [],
        forbitShare: true
      }
    },
    {
      path: '*',
      name: 'notFound',
      component: () => import('@/views/not_found')
    }
  ]
})

/**
 * 通过sessionId获取全局信息（这里是企微环境）
 * 例1：公众号环境，通过sessionId获取appid
 * 例2：企业号环境，通过sessionId获取corpId和agentId
 */
let getGlobalInfo = (to) => {
  return new Promise((resolve, reject) => {
    // 判断当前应用的运行环境
    if (!sessionStorage.getItem('userAgent')) {
      let vue = new Vue()
      vue.checkUserAgent()
    }
    // 本地环境，获取模拟数据
    if (process.env.NODE_ENV === 'development') {
      sessionStorage.setItem('isRedirect', true)
      // sessionStorage.setItem('corpId', 'wwb61d1788cf650922')
      // sessionStorage.setItem('agentId', '1000013')
      sessionStorage.setItem('userId', 'BaMei')
      // sessionStorage.setItem('userId', 'will')
      // sessionStorage.setItem('openid', 'oYleiwU7THlKBUZxGN08i9KfHltg') // 企业号openid-好运来-朱敏宏
      // sessionStorage.setItem('openid', 'oYleiweVMSartFSgk704bO2oR6dw') // 企业号openid-好运来-李影
      // sessionStorage.setItem('openid', '58932458947398796436') // 企业号openid-好运来-随机
    }
    /**
     * 【注】由于属于多个应用的H5之间会互相跳转，所以必须保证当前全局参数（如sessionId、agentId）始终与对应应用一致
     * 如果地址栏上有sessionId参数，则与本地缓存中的sessionId比较
     * 如果不相同，就清空所有相关全局参数，重新获取
     */
    if (to.query && to.query.sessionId) {
      if (sessionStorage.getItem('sessionId') !== to.query.sessionId) {
        sessionStorage.removeItem('sessionId')
        sessionStorage.removeItem('agentId')
        sessionStorage.removeItem('corpId')
        sessionStorage.removeItem('gotGlobalData')
      }
    }
    // 如果有应用id执行下一步，否则进行获取
    if (sessionStorage.getItem('agentId')) {
      resolve('获取企微信息（corpId和agentId）成功')
    } else {
      if (to.query && to.query.sessionId) {
        sessionStorage.setItem('sessionId', to.query.sessionId)
        let url = `/session`
        let param = {
          psid: to.query.sessionId
        }
        get(url, param).then(res => {
          if (res.code === 200 && res.data) {
            sessionStorage.setItem('corpId', res.data.corpId)
            sessionStorage.setItem('agentId', res.data.agentId)
            resolve('获取企微信息（corpId和agentId）成功')
          } else {
            reject(new Error('获取企微信息（corpId和agentId）失败'))
          }
        })
      } else {
        reject(new Error('获取企微信息（corpId和agentId）失败'))
      }
    }
  })
}

/**
 * 用于获取路由query参数
 */
// 获取当前路径上的openid 和 isRedrect
let checkRouteQuery = (to, cb) => {
  if (to.query && to.query.userId) {
    sessionStorage.setItem('userId', to.query.userId)
  }
  if (to.query && to.query.openid) {
    sessionStorage.setItem('openid', to.query.openid)
  }
  if (to.query && to.query.redirect) {
    sessionStorage.setItem('isRedirect', to.query.redirect)
  }
  if (to.query) {
    // 如果地址栏上又敏感信息参数，需要去除这些参数
    if (to.query.userId || to.query.openid || to.query.agentId || to.query.corpId || to.query.appid) {
      // 去除地址栏上的敏感参数
      let link = location.href.replace(/&?(userId|openid|agentId|corpId|appid|ssid|redirect)=[^&]+/g, '')
      // sessionStorage.setItem('reloaded', true)
      // 如果是从网页授权返回的页面，在缓存中标记，用于location.replace后返回上一个页面
      if (to.query.redirect) {
        sessionStorage.setItem('needHistoryBack', true)
      }
      if (history.replaceState) { // 安卓兼容
        history.replaceState({}, document.title, link)
        location.reload()
      } else {
        location.replace(link) // ios
      }
    // 如果地址栏上没有敏感信息参数， 且是从网页授权返回的页面，则直接返回上一个页面
    } else if (to.query.redirect && sessionStorage.getItem('isRedirect')) {
      return setTimeout(() => {
        history.go(-1)
      }, 0)
    // 如果缓存中有返回上一页标记，则说明此页面是网页授权返回的页面
    // 需要立即清除缓存标记，并返回上一页
    // 此操作用于优化 网页授权后，用户离开页面需要返回两次的问题
    } else if (sessionStorage.getItem('needHistoryBack')) {
      return setTimeout(() => {
        sessionStorage.removeItem('needHistoryBack')
        history.go(-1)
      }, 0)
    // 如果地址栏上没有参数需要去除，则继续后续逻辑
    } else {
      if (cb && typeof cb === 'function') {
        cb()
      }
    }
  } else {
    if (cb && typeof cb === 'function') {
      cb()
    }
  }
}

// 处理没有获取到
let handleNoUserId = () => {
  // 如果是微信环境，显示企业号引导关注二维码
  if (sessionStorage.getItem('userAgent') === 'wechat') {
  // if (sessionStorage.getItem('userAgent') === 'normal') {
    window.eventBus.$emit('showCorpQr')
  } else {
    // 如果没有userId, 但已经进行过网页授权，则表示非企业微信环境或非企业用户
    window.eventBus.$emit('showVisitLimit', '非企业成员无法访问')
  }
}

/**
 * 校验是否授权
 * 企微的网页授权用于获取userId
 */
let checkAuth = () => {
  return new Promise((resolve, reject) => {
    // 获取到userid，直接进行后续操作
    if (sessionStorage.getItem('userId')) {
      resolve()
    } else {
      // 如果没有userId, 但已经进行过网页授权
      if (sessionStorage.getItem('isRedirect')) {
        // 如果是微信环境，且获得了openid， 则尝试通过企业号openid换取userId
        if (sessionStorage.getItem('userAgent') === 'wechat' && sessionStorage.getItem('openid')) {
          let vue = new Vue()
          let url = `${vue.SERVICE_PORTAL}/cp/convert/userId`
          let param = {
            agentId: sessionStorage.getItem('agentId'),
            openid: sessionStorage.getItem('openid')
          }
          post(url, param).then(res => {
            if (res.data) {
              sessionStorage.setItem('userId', res.data)
              resolve()
            } else {
              handleNoUserId()
            }
          }).catch((e) => {
            console.log('通过openid获取userId失败 e: ', e)
            handleNoUserId()
          })
        } else {
          handleNoUserId()
        }
      } else {
        console.log('授权')
        // 没有userid，且未进行网页收取按，则进行网页授权
        let pagePath = encodeURIComponent(`${location.href}`)
        // let url = `http://yuemia.isadream.cn/wechat/cp/portal/${sessionStorage.getItem('agentId')}/auth?redirectUrl=${pagePath}` // 本地
        let url = `${location.origin}${process.env.VUE_APP_SERVICE_API}/wechat/cp/portal/${sessionStorage.getItem('agentId')}/auth?redirectUrl=${pagePath}` // 线上
        location.href = url
      }
    }
  })
}

/**
 * 获取全局参数
 */
let getGlobalData = (to, next) => {
  // 如果已有全局参数，继续向下执行
  if (sessionStorage.getItem('gotGlobalData')) {
    next()
  } else {
    Promise.all([
      getUserInfo(),
      getAgentInfo(),
      getTenantInfo()
    ]).then(() => {
      sessionStorage.setItem('gotGlobalData', true)
      next()
    }).catch(err => {
      Toast({
        message: err.message || '获取全局参数失败'
      })
    })
  }
}

// 获取会议对应的租户信息
let getTenantInfo = () => {
  return new Promise((resolve, reject) => {
    // 如果已经有tenantInfo，直接进行后续操作
    if (sessionStorage.getItem('tenantInfo')) {
      resolve()
    } else {
      let url = `/org/property`
      get(url).then(res => {
        if (res.code === 200) {
          if (res.data) {
            sessionStorage.setItem('tenantInfo', JSON.stringify(res.data))
            resolve('获取租户信息成功')
          } else {
            reject(new Error('获取租户信息失败'))
          }
        } else {
          reject(new Error('获取租户信息失败'))
        }
      })
    }
  })
}

// 获取会议对应的应用信息
let getAgentInfo = () => {
  return new Promise((resolve, reject) => {
    // 如果已经有tenantInfo，直接进行后续操作
    if (sessionStorage.getItem('agentInfo')) {
      resolve()
    } else {
      let url = `/cp/app/${sessionStorage.getItem('agentId')}`
      get(url).then(res => {
        if (res.code === 200) {
          if (res.data) {
            sessionStorage.setItem('agentInfo', JSON.stringify(res.data))
            resolve('获取应用信息成功')
          } else {
            reject(new Error('获取应用信息失败'))
          }
        } else {
          reject(new Error('获取应用信息失败'))
        }
      })
    }
  })
}

/**
 * 获取用户信息
 */
let getUserInfo = () => {
  return new Promise((resolve, reject) => {
    // 如果没有拿到 userId
    if (!sessionStorage.getItem('userId')) {
      sessionStorage.setItem('cpUserName', '')
      sessionStorage.setItem('cpUserMobile', '')
      sessionStorage.setItem('cpUserAvatar', '')
      return resolve('获取企微用户信息成功')
    }
    let url = `/portal/cp/${sessionStorage.getItem('corpId')}/${sessionStorage.getItem('userId')}`
    get(url).then(res => {
      if (res.code === 200) {
        if (res.data) {
          sessionStorage.setItem('cpUserName', res.data.name)
          sessionStorage.setItem('cpUserMobile', res.data.mobile)
          sessionStorage.setItem('cpUserAvatar', res.data.avatar)
        } else {
          sessionStorage.setItem('cpUserName', '')
          sessionStorage.setItem('cpUserMobile', '')
          sessionStorage.setItem('cpUserAvatar', '')
        }
        resolve('获取企微用户信息成功')
      } else {
        reject(new Error('获取企微用户信息失败'))
      }
    })
  })
}

route.beforeEach((to, from, next) => {
  document.title = to.meta && to.meta.title ? to.meta.title : ''
  getGlobalInfo(to).then(() => {
    checkRouteQuery(to)
    checkAuth().then(() => {
      getGlobalData(to, next)
    })
  }).catch(err => {
    console.log(err)
    Toast({
      message: err
    })
  })
})

route.afterEach((to, from) => {
  setTimeout(() => {
    let vue = new Vue()
    // 如果该页面不需要单独设置 微信工具菜单显隐 和 设置分享
    if (!to.meta.setMenuAndShareInPage) {
      let param = {}
      // 是否显示所有微信工具菜单
      if (to.meta.showAllMenu) {
        param.showAllMenu = to.meta.showAllMenu
      }
      // 显示微信工具菜单列表
      if (to.meta.showMenuList) {
        param.showMenuList = to.meta.showMenuList
      }
      // 是否禁止自定义分享
      if (to.meta.forbitShare) {
        param.forbitShare = to.meta.forbitShare
      }
      // 分享配置参数
      if (to.meta.shareInfo) {
        param.shareInfo = to.meta.shareInfo
      }
      vue.setToolMenuAndShare(param)
    }
  }, 300)
  Toast.clear()
  Dialog.close()
})
export default route
